/*
 * @(#)StringUtil.java $version 2012-3-27
 * 
 * Copyright 2011 RogueDevelopment Gruop. All rights Reserved.
 * ROGUEDEVELOPMENT PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 */
package com.nadostar.extensions;


import java.text.NumberFormat;
import java.util.Calendar;
import java.util.Date;

public class StringUtil {

	public static String [] op = {"<script","</script>","javascript:","vbscript:","<iframe","</iframe>","<form","</form>"};
	public static String [] tp = {"<!--SCRIPT","</SCRIPT-->","JAVA-SCRIPT:","VB-SCRIPT:","<!--IFRAME","</IFRAME-->","<!--FORM","</FORM-->"};

	/**
	 * Null String to Blank
	 * @param Check String
	 * @return	If parameter is NULL, Blank String is returned.
	 */
	public static String checkNull(String str) {
		if( str == null )
			return "";
		else
			return str;
	}

	public static String checkDigit(String str) {
	    if(str.length() == 1){
	        str = "0" + str;
	    }
		return str;
	}
	
	/**
	 * 정수의 길이를 체크하여 2자리(앞쪽에 '0'을 붙임)를 만들어 return.
	 * @param value
	 * @return
	 */
	public static String checkDigit(int value) {
		if( value < 10 )
			return "0" + value;
		else
			return String.valueOf(value);
	}
	
	/**
	 * 문자열에서 특정 문자열을 치환한다.
	 * 예를 들어, 123456-7890123라는 문자열 str을 1234567890123 형식으로 바꾸고 싶다면,
	 * replaceStr( str, "-", "") 로 호출한다.
	 * 
	 * @param source String 변환할 문자열
	 * @param keyStr String 치환 대상 문자열
	 * @param toStr String 치환될 문자열
	 * @return the translated string.
	 */
	public static String replaceStr(String source, String keyStr, String toStr) {

		if (source == null) return null;
		
		int startIndex = 0;
		int curIndex = 0;
		
		StringBuffer result = new StringBuffer();

		while ((curIndex = source.indexOf(keyStr, startIndex)) >= 0) {
			result.append(source.substring(startIndex, curIndex)).append(toStr);

			startIndex = curIndex + keyStr.length();
		}

		if (startIndex <= source.length())
			result.append(source.substring(startIndex, source.length()));

		return result.toString();
	}
	
	/**
	 * String 에 특정 문자열의 갯수를 리턴한다.
	 * 
	 * @param source	원본 문자열
	 * @param keyStr	갯수를 찾을 문자열
	 * @return
	 */
	public static int countOfString(String source, String keyStr) {
		int count = 0;

		for (int i = 0; source != null && i < source.length(); i++) {
			if (source.indexOf(keyStr, i) == -1)
				break;
			else {
				i = source.indexOf(keyStr, i);
				count++;
			}
		}

		return count;
	}
	
	/**
	 * String을 key 값으로 분리하여 배열을 리턴한다.
	 * StringTokenizer의 버그를 수정.
	 * 
	 * @param source	원본 문자열
	 * @param key		배열로 나눌 문자열
	 * @return
	 */
    public static String[] toArray(String source, String key) {
    	if( source == null || "".equals(source)) 
    		return null;
    	
        String[] returnVal = null;

        returnVal = new String[countOfString(source, key) + 1];
        
        int idxKey = -1;
        int j = 0;
        while( (idxKey = source.indexOf(key)) > -1 )
        {
            returnVal[j] = source.substring(0, idxKey);
            source = source.substring(idxKey + key.length());
            j++;
        }
        returnVal[j] = source;

        return returnVal;
    }
    
    /**
     * padLen의 길이만큼 왼쪽에 padChar를 추가하여 리턴한다.
     *  
     * @param str
     * @param padChar
     * @param padLen
     * @return
     */
    public static String lpad(String str, char padChar, int padLen) {
    	if( str == null )
    		return null;
    	
    	while( str.length() < padLen )
    		str = padChar + str;
    	
    	return str;
    }
    
    /**
     * padLen의 길이만큼 오른쪽에 padChar를 추가하여 리턴한다.
     * 
     * @param str
     * @param padChar
     * @param padLen
     * @return
     */
    public static String rpad(String str, char padChar, int padLen) {
    	if( str == null )
    		return null;
    	
    	while( str.length() < padLen )
    		str = str + padChar;
    	
    	return str;
    }
    
    /**
     * 문자열을 int 형으로 변환하여 리턴한다.
     * 
     * @param str
     * @return
     */
    public static int toInt(String str) {
    	if( str == null || "".equals(str.trim()) )
    		return 0;
    	
    	return Integer.parseInt(str);
    }
    
    /**
     * 문자열을 double 형으로 변환하여 리턴한다.
     * 
     * @param str
     * @return
     */
    public static double toDouble(String str) {
    	if( str == null || "".equals(str.trim())  ){
    		return 0;
    	}
    	
    	return Double.parseDouble(str);
    
    }
    
    /**
     * 문자열이 숫자인지 확인한다.
     * 
     * @param str
     * @return
     */
    public static boolean isNumber(String str) {
    	if( str == null || str.trim().length() == 0 )
    		return false;
    	
    	for( int i = 0; i < str.length(); i++ ) {
    		char c = str.charAt(i);
    		if( c < '0' || c > '9' )	
    			return false;
    	}
    	
    	return true;
    }

    /**
     * 문자열을 trim() 하여 리턴한다.(null일 경우 ""를 리턴)
     * 
     * @param str
     * @return
     */
    public static String trimString(String str) {
		String strTmp;

		if (str == null || str == "")
			strTmp = "";
		else
			strTmp = str.trim();

		return strTmp;
	}
    
    /**
     * 문자열의 값이 null 인경우 nvlStr이 리턴된다.
     * 
     * @param str
     * @param nvlStr
     * @return
     */
    public static String nvl(String str, String nvlStr) {
    	if( str == null || "".equals(str) || "null".equals(str))
    		return nvlStr;
    	
    	return str;
    }
	
	public static String nvl(Object obj, String value) {
		if( obj == null )
			return value;
		
		if( obj instanceof String ) 
			return obj.toString();
		else if ( obj instanceof Integer )
			return obj + "";
		else
			return value;
	}
	
	
    /**
     * 문자열을 set+문자열(첫글자 대문자)로 만들어 리턴한다.
     * 
     * @param str
     * @return
     */
    public static String makeSetMethodName(String str) {
    	if( str == null )
    		return null;
    	
    	StringBuffer methodName = new StringBuffer();
	    methodName.append("set");
	    methodName.append(str.substring(0,1).toUpperCase());
	    methodName.append(str.substring(1));
	    
	    return methodName.toString();
    }
    
    /**
     * string으로 타입 변환
     * @param obj
     * @return
     */
    public static String toString(Object obj) {
    	if( obj == null )
    		return "";
    	
    	if( obj instanceof String )
    		return obj.toString().trim();
    	else if( obj instanceof StringBuffer )
    		return obj.toString().trim();
    	else if( obj instanceof Integer) 
			return obj + "";
    	else
    		return "NaN";
    }
    
    /**
     * str 값이 0인경우 null 로 리턴.
     * @param str
     * @return
     */
    public static String zero2null(String str) {
    	if( str == null )
    		return str;
    	
    	//int i = Integer.parseInt(str);
    	double i = Double.parseDouble(str);
    	if( i == 0 )
    		return null;
    	else
    		return str;
    }

    /**
     * @param no String
     */
    public static String makeMoneyType(String no) {
        if ( no == null || no.trim().length() == 0 ) return "";

        int index = no.indexOf(".");
        if (index == -1) {
            return makeMoneyType( Long.parseLong(no) );
        } else {
        	return (
                makeMoneyType( Long.parseLong(nvl(no.substring(0, index), "0")) ) +
                no.substring(index, no.length())
            );
        }
    }

    public static String makeMoneyType(int no) {
        return ( makeMoneyType( (new Integer(no)).longValue() ) );
    }

    public static String makeMoneyType(long no) {
        return NumberFormat.getInstance().format(no);
    }

    public static String makeMoneyType(double no) {
        return NumberFormat.getInstance().format(no);
    }

    public static String makeMoneyType(float no) {
        return ( makeMoneyType( (new Float(no)).doubleValue() ) );
    }
    
    /**
     * Date타입으로 변환하여 return
     * @param str
     * @return
     */
    public static Date makeDateType(String str) {

        if ( str == null || str.trim().length() == 0 || "null".equals(str)) return new Date();

        String tStr = replaceStr(replaceStr(replaceStr(str, ".", ""), "/", ""), "-", "");
        
        if( tStr.length() == 4 )
        	return new Date(Integer.parseInt(tStr));
        else if( tStr.length() == 6 ) {
        	Calendar cal = Calendar.getInstance();
        	cal.set(Calendar.YEAR, Integer.parseInt(tStr.substring(0, 4)));
        	cal.set(Calendar.MONTH, Integer.parseInt(tStr.substring(4, 6))-1);
        	return cal.getTime();
        }
        else if( tStr.length() == 8 ) {
        	Calendar cal = Calendar.getInstance();
        	cal.set(Calendar.YEAR, Integer.parseInt(tStr.substring(0, 4)));
        	cal.set(Calendar.MONTH, Integer.parseInt(tStr.substring(4, 6))-1);
        	cal.set(Calendar.DATE, Integer.parseInt(tStr.substring(6, 8))-1);
        	return cal.getTime();
        } else 
        	return null;
    }

	
	/**
	 * 오늘 날짜를 'YYYYMMDD' 형태의 문자열로 만들어 return한다.
	 * @return	String
	 */
	public static String getToday2String(String delimeter) {
		Calendar calendar = Calendar.getInstance();
		
		return 	calendar.get(Calendar.YEAR) + delimeter +
				checkDigit(calendar.get(Calendar.MONTH)+1) + delimeter +
				checkDigit(calendar.get(Calendar.DATE));
	}
	

    /**
     * convert html specail charater
     * @param strHtml String
     * @return String
     */
    public static String convertHTML(String strHtml) {
    	
        if (strHtml == null)
            return "";

        char[] arrStat = strHtml.toCharArray();
        StringBuffer sb = new StringBuffer();

        for (int i=0; i<arrStat.length; i++) {
            switch (arrStat[i]) {
                case '\n':
		                    sb.append("<br>");
		                    break;
                case '\t':
		                    sb.append("&nbsp;&nbsp;&nbsp;");	
		                    break;
                case '\"':
		                    sb.append("&quot;");
		                    break;
                case '<':
		                    sb.append("&lt;");
		                    break;
                case '>':
		                    sb.append("&gt;");
		                    break;
                case ' ':
		                    sb.append("&nbsp;");
		                    break;
                case '&':
		                    sb.append("&amp;");
		                    break;
                default	:
                			sb.append(arrStat[i]);
            }
        }
        return sb.toString();
    }

    /**
     * convert html specail charater(use in textbox)
     * @param strHtml String
     * @return String
     */
    public static String convertHTML2(String strHtml) {
    	
        if (strHtml == null)
            return "";

        char[] arrStat = strHtml.toCharArray();
        StringBuffer sb = new StringBuffer();

        for (int i=0; i<arrStat.length; i++) {
            switch (arrStat[i]) {
                case '\t':
                    		sb.append("&nbsp;&nbsp;&nbsp;");	
                    		break;
                case '\"':
		                    sb.append("&quot;");
		                    break;
                case '<':
		                    sb.append("&lt;");
		                    break;
                case '>':
		                    sb.append("&gt;");
		                    break;
                case ' ':
		                    sb.append("&nbsp;");
		                    break;
                case '&':
		                    sb.append("&amp;");
		                    break;
                default	:
                			sb.append(arrStat[i]);
            }
        }
        return sb.toString();
    }

    /**
     * convert html specail charater
     * @param strHtml String
     * @return String
     */
    public static String convertHTML3(String strHtml) {
    	
        if (strHtml == null)
            return "";

        char[] arrStat = strHtml.toCharArray();
        StringBuffer sb = new StringBuffer();

        for (int i=0; i<arrStat.length; i++) {
            switch (arrStat[i]) {
                case '\n':
		                    sb.append("<br>");
		                    break;
                case '\t':
		                    sb.append("&nbsp;&nbsp;&nbsp;");	
		                    break;
                case '\"':
		                    sb.append("&quot;");
		                    break;
                case '<':
		                    sb.append("&lt;");
		                    break;
                case '>':
		                    sb.append("&gt;");
		                    break;
                case ' ':
		                    sb.append("&nbsp;");
		                    break;
                case '&':
		                    sb.append("&amp;");
		                    break;
                default	:
		                    sb.append(arrStat[i]);
            }
        }
        return sb.toString();
    }


    /**
     * 보안문제로 본문내의 <script...> tag제거하기 위한 함수
     * @return string.
     * @param source String 변환할 문자열
     */
    public static String stripScriptTag(String source)
    {
        if (source == null) return null;

		String tmpStr = source;
		for ( int i = 0 ; i < op.length ; i++)
		{
			int idx = tmpStr.toLowerCase().indexOf(op[i]);
			while ( idx >= 0)
			{
				StringBuffer sb = new StringBuffer("");
				sb.append(tmpStr.substring(0,idx));
				sb.append(tp[i]);
				sb.append(tmpStr.substring(idx+op[i].length()));
				tmpStr = sb.toString();
				idx = tmpStr.toLowerCase().indexOf(op[i]);
			}
		}
		return tmpStr;
    }

}
